home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / BTV115.ARJ / TONE.PAS < prev    next >
Pascal/Delphi Source File  |  1991-05-29  |  5KB  |  196 lines

  1. UNIT Tone;  {$S-,R-,D-,L-}
  2.  
  3.     (* TONE.PAS - Sound Module for Turbo Pascal 6.0 - Turbo Vision
  4.      * Written by Richard R. Sands
  5.      * Compuserve ID 70274,103
  6.      * January 1991
  7.      *
  8.      * NOTE: Do Not Overlay
  9.      *)
  10.  
  11. INTERFACE
  12.  
  13.    Procedure Sound(Hz:Word);
  14.    Procedure NoSound;
  15.    Procedure Delay(MS : Word);
  16.  
  17.    Procedure Beep(Hz, MS:Word);
  18.      { Same as
  19.                Sound(Hz);
  20.                Delay(MS);
  21.                NoSound;       ...but with more efficient code. }
  22.  
  23.    Procedure BoundsBeep;
  24.      { Used for signalling a boundry or invalid command }
  25.  
  26.    Procedure ErrorBeep;
  27.      { Used for signalling an error condition }
  28.  
  29.    Procedure AttentionBeep;
  30.      { Used for signalling the user }
  31.  
  32. IMPLEMENTATION
  33.  
  34.   VAR
  35.     OneMS : Word;
  36.  
  37. { ------------------------------------------------------------------------- }
  38. Procedure Beep(Hz, MS:Word); assembler;
  39.      { Make the Sound at Frequency Hz for MS milliseconds }
  40.   ASM
  41.     MOV  BX,Hz
  42.     MOV  AX,34DDH
  43.     MOV  DX,0012H
  44.     CMP  DX,BX
  45.     JNC  @Stop
  46.     DIV  BX
  47.     MOV  BX,AX
  48.     IN      AL,61H
  49.     TEST AL,3
  50.     JNZ  @99
  51.     OR      AL,3
  52.     OUT  61H,AL
  53.     MOV  AL,0B6H
  54.     OUT  43H,AL
  55.  @99:
  56.     MOV  AL,BL
  57.     OUT  42H,AL
  58.     MOV  AL,BH
  59.     OUT  42H,AL
  60.  @Stop:
  61.  {$IFOPT G+}
  62.     PUSH MS
  63.  {$ELSE }
  64.     MOV  AX, MS   { push delay time }
  65.     PUSH AX
  66.   {$ENDIF }
  67.     CALL Delay    { and wait... }
  68.  
  69.     IN   AL, $61  { Now turn off the speaker }
  70.     AND  AL, $FC
  71.     OUT  $61, AL
  72.   end;
  73.  
  74. { ------------------------------------------------------------------------- }
  75. Procedure BoundsBeep; assembler;
  76.   asm
  77.   {$IFOPT G+ }
  78.      PUSH 1234      { Pass the Frequency }
  79.      PUSH 10        { Pass the delay time }
  80.   {$ELSE}
  81.      MOV  AX, 1234  { Pass the Frequency }
  82.      PUSH AX
  83.      MOV  AX, 10    { Pass the delay time }
  84.      PUSH AX
  85.    {$ENDIF }
  86.      CALL Beep
  87.   end;
  88.  
  89. { ------------------------------------------------------------------------- }
  90. Procedure ErrorBeep; assembler;
  91.   asm
  92.   {$IFOPT G+ }
  93.      PUSH 800   { Pass the Frequency }
  94.      PUSH 75    { Pass the delay time }
  95.   {$ELSE}
  96.      MOV  AX, 800  { Pass the Frequency }
  97.      PUSH AX
  98.      MOV  AX, 75   { Pass the delay time }
  99.      PUSH AX
  100.   {$ENDIF }
  101.      CALL Beep
  102.   end;
  103.  
  104. { ------------------------------------------------------------------------- }
  105. Procedure AttentionBeep; assembler;
  106.   asm
  107.   {$IFOPT G+ }
  108.      PUSH 660   { Pass the Frequency }
  109.      PUSH 50    { Pass the delay time }
  110.   {$ELSE}
  111.      MOV  AX, 660  { Pass the Frequency }
  112.      PUSH AX
  113.      MOV  AX, 50   { Pass the delay time }
  114.      PUSH AX
  115.   {$ENDIF }
  116.      CALL Beep
  117.   end;
  118.  
  119. { ------------------------------------------------------------------------- }
  120. Procedure Sound(Hz:Word); assembler;
  121.    ASM
  122.       MOV  BX,Hz
  123.       MOV  AX,34DDH
  124.       MOV  DX,0012H
  125.       CMP  DX,BX
  126.       JNC  @DONE
  127.       DIV  BX
  128.       MOV  BX,AX
  129.       IN   AL,61H
  130.       TEST AL,3
  131.       JNZ  @99
  132.       OR   AL,3
  133.       OUT  61H,AL
  134.       MOV  AL,0B6H
  135.       OUT  43H,AL
  136. @99:  MOV  AL,BL
  137.       OUT  42H,AL
  138.       MOV  AL,BH
  139.       OUT  42H,AL
  140. @DONE:
  141.   end;
  142.  
  143. { ------------------------------------------------------------------------- }
  144. Procedure NoSound; assembler;
  145.   asm
  146.      IN   AL, $61
  147.      AND  AL, $FC
  148.      OUT  $61, AL
  149.   end;
  150.  
  151. { ------------------------------------------------------------------------- }
  152. procedure DelayOneMS; assembler;
  153.   asm
  154.      PUSH CX         { Save CX }
  155.      MOV  CX, OneMS  { Loop count into CX }
  156.   @1:
  157.      LOOP @1         { Wait one millisecond }
  158.      POP  CX         { Restore CX }
  159.   end;
  160.  
  161. { ------------------------------------------------------------------------- }
  162. Procedure Delay(ms:Word); assembler;
  163.   asm
  164.      MOV  CX, ms    
  165.      JCXZ @2           
  166.   @1:
  167.      CALL DelayOneMS
  168.      LOOP @1
  169.   @2:
  170.   end;
  171.  
  172. { ------------------------------------------------------------------------- }
  173. Procedure Calibrate_Delay; assembler;
  174.   asm   
  175.      MOV  AX,40h         
  176.      MOV  ES,AX          
  177.      MOV  DI,6Ch          { ES:DI is the low word of BIOS timer count }
  178.      MOV  OneMS,55        { Initial value for One MS's time }
  179.      XOR  DX,DX           { DX = 0 }
  180.      MOV  AX,ES:[DI]      { AX = low word of timer }
  181.   @1:
  182.      CMP  AX,ES:[DI]      { Keep looking at low word of timer }
  183.      JE   @1              { until its value changes... }
  184.      MOV  AX,ES:[DI]      { ...then save it }
  185.   @2:
  186.      CAll DelayOneMs      { Delay for a count of OneMS (55) }
  187.      INC  DX              { Increment loop counter }
  188.      CMP  AX,ES:[DI]      { Keep looping until the low word }
  189.      JE   @2              { of the timer count changes again }
  190.      MOV  OneMS, DX       { DX has new OneMS }
  191.   end;
  192.  
  193. BEGIN
  194.   Calibrate_Delay
  195. END.
  196.